Java 知识点 类,字符串

知识点哦

  • 实例变量和局部变量,名称什么的不重要,简单来说,一个是对象的,另一个是方法内部的;有两点需要注意,第一实例变量自动初始化,比如int初始化0,但是局部变量量不会进行初始化;还有就是局部变量是可以屏蔽实例变量的;
    1
    2
    3
    4
    5
    6
    static String b = "lalalla";
    static
    {
    System.out.println(b); //这里就是类变量
    String b="buyaoa"; //这里是局部变量 不会报错的
    }

代码可以清楚地看出,局部变量确实会屏蔽掉全局的(实例变量或者类变量),这也就是说为啥要写this的原因;

  • Java中不定参数调用
    这个原来确实没用过

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public static void main(String []arg)
    {
    Test("a","b","c","d");
    }
    static public void Test(String... vlaue)
    {
    for (int i = 0; i < vlaue.length; i++) {
    System.out.println(vlaue[i]);
    }
    }
  • java中的字符串

  1. 关于字符串的理解:参考
    首先存在三个区,分别是栈,字符串常量区,堆;
    这里写图片描述
    String str1=”abc”;
    String str2=”abc”;
    String str3=”abc”;
    String str4=new String(“abc”);
    String str5=new String(“abc”);
    首先对于str1这种的是直接找字符串常量区,如果存在abc,就直接引用,如果没有就造一个,和堆没有关系;以new创建的,肯定会在堆中有对象,那么为什么会指向字符串常量区呢,因为每次都搞一个新的对象,还搞一个新的字符串很消耗空间的啊;所以字符串会找字符串常量区,如果没有,就在常量区新建一个,然后再在堆中new一个对象;
  2. 类似于下面的代码
    1
    2
    3
    4
    String str1="a";
    String str2 = str1+"b";
    String str3 = "ab";
    System.out.println(str2 == str3); //输出false

简单地说 String str3 = “ab”; 这样的代码编译时就可以确定,但是String str2 = str1+”b”;在编译器无法确定,所以就直接在堆上分配了;

  1. equals的步骤,先是==判断对象引用是不是一样,一样直接返回true,不是的的话,用instanceof检查对象类型是不是一样(包括子类);然后就是一个一个字符比较;
  2. compareTo,两个字符串如果位数不同,就输出长度差,如果相同,就输出第一个不一样字符之间的差值
  3. 字符串自动类型转换
    1
    2
    3
    4
    5
    int a = 5;
    int b = 3;
    String s = "l";
    System.out.println(a+s+b); //513
    System.out.println(a+b+s); //81 先做a+b,然后再转型

简单地说,先做相同的,再转型

  1. StringBuffer与StringBuilder
    这俩没啥区别,StringBuffer除了线程同步以外,值得注意的是这俩并没有重写equals函数,所以只能是同引用才可以相等了;
    1
    2
    3
    4
    5
    6
    StringBuffer s = new StringBuffer("aba");
    StringBuffer s1 = new StringBuffer("aba");
    StringBuilder s2 = new StringBuilder("ccc");
    StringBuilder s3 = new StringBuilder("ccc");
    System.out.println(s.equals(s1));
    System.out.println(s2.equals(s3));

默认缓存 16+字符串长度;